﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include <algorithm>
using namespace std;
#include <vector>
#include <string>
#include <functional>

/*
find算法 查找元素
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param value 查找的元素
@return 返回查找元素的位置
*/

/*
adjacent_find算法 查找相邻重复元素
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param  _callback 回调函数或者谓词(返回bool类型的函数对象)
@return 返回相邻元素的第一个位置的迭代器
*/

/*
binary_search算法 二分查找法
注意: 在无序序列中不可用
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param value 查找的元素
@return bool 查找返回true 否则false
*/

/*
count算法 统计元素出现次数
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param  value回调函数或者谓词(返回bool类型的函数对象)
@return int返回元素个数
*/

/*
count_if算法 统计元素出现次数
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param  callback 回调函数或者谓词(返回bool类型的函数对象)
@return int返回元素个数
*/

class PersonFind
{
public:
	PersonFind(string name, int age)
	{
		this->m_Name = name;
		this->m_Age = age;
	}

	bool operator==(const PersonFind& p)
	{
		if (this->m_Name == p.m_Name && this->m_Age == p.m_Age)
		{
			return true;
		}
		return false;
	}

	string m_Name;
	int m_Age;
};
//class MyCompareFind
class MyCompareFind :public binary_function<PersonFind*, PersonFind*, bool>
{
public:
	//bool operator()(PersonFind* p)
	bool operator()(PersonFind* p1, PersonFind* p2)const
	{
		//if (p->m_Name == "bbb" && p->m_Age == 20)
		if (p1->m_Name == p2->m_Name && p1->m_Age == p2->m_Age)
		{
			return true;
		}
		return false;
	}
};
class GreaterThanFour
{
public:
	bool operator()(int v)
	{
		return v >= 4;
	}
};
void testFindAlgorithms()
{
	vector<int>v;
	for (int i = 0; i < 10; ++i)
	{
		v.push_back(i);
	}
	vector<int>::iterator pos = find(v.begin(), v.end(), 5);
	if (pos != v.end())
	{
		cout << "找到了数据：" << *pos << endl;//5
	}
	else
	{
		cout << "未找到！" << endl;
	}

	//1.利用find查找自定义数据类型；
	vector<PersonFind>vP;

	PersonFind p1("aaa", 10);
	PersonFind p2("bbb", 20);
	PersonFind p3("ccc", 30);
	PersonFind p4("ddd", 40);

	vP.push_back(p1);
	vP.push_back(p2);
	vP.push_back(p3);
	vP.push_back(p4);

	vector<PersonFind>::iterator posP = find(vP.begin(), vP.end(), p2);
	if (posP != vP.end())
	{
		cout << "找到了数据，姓名：" << (*posP).m_Name << " ，年龄：" << posP->m_Age << endl;
		//找到了数据，姓名：bbb ，年龄：20
	}
	else
	{
		cout << "未找到！" << endl;
	}

	vector<PersonFind*>vPP;

	PersonFind pp1("aaa", 10);
	PersonFind pp2("bbb", 20);
	PersonFind pp3("ccc", 30);
	PersonFind pp4("ddd", 40);

	vPP.push_back(&pp1);
	vPP.push_back(&pp2);
	vPP.push_back(&pp3);
	vPP.push_back(&pp4);

	PersonFind* pp = new PersonFind("bbb", 21);//20 --> 21
	//find(vPP.begin(), vPP.end(), pp);
	//vector<PersonFind*>::iterator posPP = find_if(vPP.begin(), vPP.end(), MyCompareFind());
	vector<PersonFind*>::iterator posPP = find_if(vPP.begin(), vPP.end(), bind2nd(MyCompareFind(), pp));
	if (posPP != vPP.end())
	{
		cout << "找到了数据，姓名：" << (*posPP)->m_Name << " ，年龄：" << (*posPP)->m_Age << endl;
		//找到了数据，姓名：bbb ，年龄：20
	}
	else
	{
		cout << "未找到！" << endl;//未找到！
	}


	vector<int>va;
	va.push_back(2);
	va.push_back(3);
	va.push_back(4);
	va.push_back(5);
	//va.push_back(5);
	va.push_back(15);
	va.push_back(6);
	va.push_back(2);

	vector<int>::iterator posA = adjacent_find(va.begin(), va.end());
	if (posA != va.end())
	{
		cout << "找到了相邻重复元素为：" << *posA << endl;//5
	}
	else
	{
		cout << "未找到！" << endl;//未找到！
	}

	vector<int>vb;
	for (int i = 0; i < 10; ++i)
	{
		vb.push_back(i);
	}
	bool ret = binary_search(vb.begin(), vb.end(), 4);
	if (ret)
	{
		cout << "找到了4！" << endl;//找到了4！
	}
	else
	{
		cout << "未找到！" << endl;
	}

	vb.push_back(4);
	vb.push_back(4);
	vb.push_back(4);
	vb.push_back(4);

	int num = count(vb.begin(), vb.end(), 4);
	cout << "4出现的个数为：" << num << endl;//5

	num = count_if(vb.begin(), vb.end(), GreaterThanFour());
	cout << "大于等于4的个数为：" << num << endl;//10
}

//main335：常用查找算法
int main335()
{
	testFindAlgorithms();

	system("pause");
	return EXIT_SUCCESS;
}